www.gusucode.com > VC++ 酒店管理系统-源码程序 > VC++ 酒店管理系统-源码程序/code/hotel2003/HotelInfoShow.cpp
// HotelInfoShow.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "qq.h" #include "HotelInfoShow.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define AW_CENTER 0x00000010 #include "QQView.h" #include "Page3.h" ///////////////////////////////////////////////////////////////////////////// // CHotelInfoShow dialog //CString CHotelInfoShow::lpszShowText=""; CHotelInfoShow::CHotelInfoShow(CWnd* pParent /*=NULL*/) : CDialog(CHotelInfoShow::IDD,pParent) { //{{AFX_DATA_INIT(CHotelInfoShow) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT lpszShowText="";//构造赋值 // pntCenter.x=0; // pntCenter.y=0; } void CHotelInfoShow::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CHotelInfoShow) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CHotelInfoShow, CDialog) //{{AFX_MSG_MAP(CHotelInfoShow) ON_WM_LBUTTONDOWN() ON_WM_PAINT() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHotelInfoShow message handlers BOOL CHotelInfoShow::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //文本何时显示的问题: //在初始化函数OnInitDialog()中先调用animateWindow()形成动画效果 //在窗口完成动画效果后,如果从其他地方调用CDC::DrawText()函数的话 //没有效果,在窗口中根本就不会显示你要显示的文本 //解决方法是: //在直接调用AnimateWindow()后,立即调用CDC::DrawText()函数显示的文本 //是正确的文本 //若想通过OnPaint()函数来达到这个目的不行 //初始化函数中调用AnimateWindow()后不会再调用OnPaint(),达不到预期的效果 // [6/7/2003-20:08] //当鼠标点击视图区时,以鼠标点击的点为中心点逐渐显示对话框 //但是显示的开始点总是视图区域的原点CPoint(0,0); //需要修改 // [6/7/2003-22:52] // CRect rect; // this->GetClientRect(&rect); // CQQView* pView=CQQView::GetView(); // CPoint pntCenter=pView->pnt; // ClientToScreen(&pntCenter);//pntCenter.x-rect.Width()/2,pntCenter.y-rect.Height()/2 // this->SetWindowPos(&CWnd::wndTop,pntCenter.x-rect.Width()/2,pntCenter.y-rect.Height()/2,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); this->CenterWindow(); HINSTANCE m_hInst=LoadLibrary("user32.dll"); typedef BOOL(WINAPI* LPANIMATEWND)(HWND,DWORD,DWORD); LPANIMATEWND m_aniwnd=(LPANIMATEWND)GetProcAddress(m_hInst,"AnimateWindow"); m_aniwnd(this->GetSafeHwnd(),650,AW_CENTER); this->ShowText(lpszShowText);//显示文本 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CHotelInfoShow::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDialog::OnLButtonDown(nFlags, point); CDialog::EndDialog(IDOK); CQQView* pView=CQQView::GetView(); CDC* pDC=pView->GetDC(); CRect rect; pView->GetClientRect(&rect); CPage3 page3; if(pView->nImgTypeInView==13) { // pView->Invalidate(TRUE); //there is a bug!! //重画有问题!!仍然需要解决!!!!!!! // [6/7/2003-21:46] pDC->FillSolidRect(rect,pDC->GetBkColor()); page3.DrawFrameImg(pDC,CRect(page3.xStart,page3.yStart,page3.xStart+350,page3.yStart+200)); } } void CHotelInfoShow::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // CRect rect; // this->GetClientRect(&rect); // CSize size=dc.GetTextExtent(lpszShowText); // long xStart=rect.left+(rect.Width()-size.cx)/2; // long yStart=rect.top+(rect.Height()-size.cy)/2; // // dc.TextOut(xStart,yStart,lpszShowText); // CRect rectText(xStart,yStart,xStart+size.cx,yStart+size.cy); // dc.SetBkMode(TRANSPARENT); // //打印文本的时候不能自动换行 // if( size.cx < rect.Width()) // dc.DrawText(lpszShowText ,rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // else // dc.DrawText(lpszShowText, rectText, DT_CENTER | DT_WORDBREAK); // dc.DrawText(lpszShowText,&rectText,DT_CENTER | DT_WORDBREAK); // bFinish=false; // Do not call CDialog::OnPaint() for painting messages } void CHotelInfoShow::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default // 通过时间器来形成动画的效果很不好,屏幕总是在闪动 [5/25/2003-13:28] // this->ShowWindow(SW_HIDE); // CRect rect; // this->GetClientRect(&rect); // long xCenter=(rect.left+rect.right)/2; // long yCenter=(rect.top+rect.bottom)/2; // // CRgn testrgn; // // // int m=GetSystemMetrics(SM_CYSIZEFRAME); // // //以下代码实现对话框的动态弹出 // static int i=10; // if(i<rect.Width()/2) // { // testrgn.CreateRectRgn(xCenter-i,yCenter-i,xCenter+i,yCenter+i); // // SetWindowRgn((HRGN) testrgn,TRUE); // // ShowWindow(SW_SHOW); // // CenterWindow(); // // testrgn.DeleteObject(); // i+=5; // } // // else // { // this->ShowWindow(SW_SHOW);//动态显示完成后要显示原来的对话框 // this->KillTimer(0); // } CDialog::OnTimer(nIDEvent); } /************************************************************************/ /* 函数功能:将位图拷贝道指定的Rect内 // 参数说明: // pDC:设备上下文,用来拷贝位图 // rect:用来拷贝位图的区域 */ /************************************************************************/ void CHotelInfoShow::FillRectUseBMP(CDC *pDC, CRect rect) { CDC MemDC; MemDC.CreateCompatibleDC(pDC);//创建与pDC兼容的设备上下文 CBitmap m_bitmap; m_bitmap.LoadBitmap(IDB_TEXTBK); MemDC.SelectObject(&m_bitmap);//将位图对象选入设备上下文 BITMAP bitamp; m_bitmap.GetBitmap(&bitamp);//获取位图属性 pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,bitamp.bmWidth,bitamp.bmHeight,SRCCOPY); m_bitmap.DeleteObject(); } void CHotelInfoShow::ShowText(CString strShowText) { CDC* pDC=this->GetDC(); CRect rect,strTextRect; GetClientRect(&rect); // int nMaxLength=0; CRect rectTextShw(rect.Width()/10,rect.Height()/10,rect.Width()*9/10,rect.Height()*9/10); CSize sizeText=pDC->GetTextExtent(strShowText); FillRectUseBMP(pDC,rect); pDC->SetBkMode(TRANSPARENT); if(sizeText.cx<rectTextShw.Width()) { pDC->DrawText(strShowText,&rectTextShw,DT_CENTER | DT_VCENTER | DT_SINGLELINE); } else { pDC->DrawText(strShowText,&rectTextShw,DT_CENTER | DT_WORDBREAK); } }